//
// Created by HhL on 2021/7/8.
//
#include "../../include/heap_utils.h"
#include <stddef.h> //offsetof的头文件

#define  MYADD(x, y)  ((x) + (y)) //宏函数


void test01() {
    int* p = getSpace();
    for (int i = 0; i < 5; i++) {
        printf("%d\n", p[i]);
    }

    //手动开辟  手动释放
    free(p);
    p = NULL;

}

void test02() {
    char* p = NULL;
    allocateSpace(p);
    printf("%s\n", p);
}

void test03() {
    char* p = NULL;
    allocateSpace2(&p);
    printf("%s\n", p);

    if (p != NULL) {
        free(p);
        p = NULL;
    }
}

//步长练习，自定义数据类型练习
struct Person {
    char a;     // 0 ~ 3
    int b;      // 4 ~ 7
    char buf[64]; // 8 ~ 71
    int d;     // 72 ~ 75
};

void test_point_step() {
    struct Person p = {'a', 10, "hello world", 20};
    //计算占用字节大小
    printf("d属性的偏移量： %d\n", offsetof(struct Person, d));

    printf("d属性的值为：%d\n", *(int*) ((char*) &p + offsetof(struct Person, d)));
}

//calloc
void test_calloc() {
    //int * p = malloc(sizeof(int)* 10);

    int* p = calloc(10, sizeof(int)); //calloc 分配在堆区，与malloc不同的是 calloc会初始化数据为0

    for (int i = 0; i < 10; i++) {
        printf("%d\n", p[i]);
    }

    if (p != NULL) {
        free(p);
        p = NULL;
    }

}


//realloc  重新分配内存
void test_malloc() {
    int* p = malloc(sizeof(int) * 10);

    for (int i = 0; i < 10; i++) {
        p[i] = i + 100;
    }

    for (int i = 0; i < 10; i++) {
        printf("%d\n", p[i]);
    }

    printf("%d\n", p);

    //如果重新分配的内存比原来大，那么不会初始化新空间为0
    p = realloc(p, sizeof(int) * 20);

    printf("%d\n", p);

    for (int i = 0; i < 20; i++) {
        printf("%d\n", p[i]);
    }

    //如果重新分配的内存比原来小，那么释放后序空间，只有权限操作申请空间
    p = realloc(p, sizeof(int) * 5);
    printf("%d\n", p);
    printf("%d\n", p[0]);
    printf("%d\n", p[5]);
}

void little_endian() {
    int a = 0x11223344;
    char* p = &a;
    printf("%x\n", *p);    //44  低位字节数据  低地址
    printf("%x\n", *(p + 1)); //33  高位字节数据  高地址
}

//static 静态变量
// 特点：在运行前分配内存，程序运行结束 生命周期结束  ，在本文件内都可以使用静态变量
// 全局作用域 a
static int a = 10;

void test_static() {
    //局部作用域 b
    static int b = 20;
    printf("a = %d,b = %d\n", a, b);
}

void test_extern() {
    extern int g_a;
    printf("g_a = %d\n", g_a);

}

void test_sprintf() {
    char buf[1024];
    int num = 100;
    //设置宽度 右对齐
    memset(buf, 0, 1024);
    sprintf(buf, "%8d", num);
    printf("buf:%s\n", buf);
    ////设置宽度 左对齐
    memset(buf, 0, 1024);
    sprintf(buf, "%-8d", num);
    printf("buf:%sa\n", buf);
    //转成16进制字符串 小写
    memset(buf, 0, 1024);
    sprintf(buf, "0x%x", num);
    printf("buf:%s\n", buf);

    //转成8进制字符串
    memset(buf, 0, 1024);
    sprintf(buf, "0%o", num);
    printf("buf:%s\n", buf);

}

int main() {

//    printf("score = %d\n", 1);
//    test01();
//    test02();
//    test03();
//    test_static();
//    test_extern();
//    printf("%d\n", MYADD(10, 20) * 20 );
    //小端存储
//    little_endian();
//    test_sprintf();//格式化打印
    test_point_step();
    return 0;
}


